/**
 * 
 */
package com.nassir.xml.xmlparse;

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * XML相关操作
 * 
 * @author nassir wen
 * @date 2011-9-26
 * @version V2.5
 * @Company: MSD.
 * @Copyright Copyright (c) 2011
 */
public class XmlHelper {

    /**
     * 
     * 通过已知xml字符串创建document对象
     * 参�?:http://dennis-zane.iteye.com/blog/57542
     * @param xmlStr
     * @return
     * @throws DocumentExceptionss
     */
    public static Document createDocByXmlStr(String xmlStr) throws DocumentException {
        return DocumentHelper.parseText(xmlStr);
    }

    /**
     * 
     * 通过xml文件路径创建已知字符串document对象
     * 
     * @param path
     * @return
     * @throws DocumentException
     */
    public static Document createDocByPath(String path) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        return saxReader.read(path);
    }

    /**
     * 通过xml字节流Document对象
     * 
     * @return
     */
    public static Document createDoc(InputStream in) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        return saxReader.read(in);
    }

    /**
     * 创建Document对象
     * 
     * @return
     */
    public static Document createDoc() {
        return DocumentHelper.createDocument();
    }

    /**
     * 获取单个node
     * 
     * @param xPath
     * @return
     */
    public static Node getNode(Document doc, String xPath) {
        return doc.selectSingleNode(xPath);
    }

    /**
     * 获取集合nodes
     * 
     * @param xPath
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List<Node> getNodes(Document doc, String xPath) {
        return doc.selectNodes(xPath);
    }

    /**
     * 获取属�?�?
     * 
     * @param node
     * @param attrName
     * @return
     */
    public static String getAttrVal(Node node, String attrName) {
        Element e = (Element) node;
        return e.attributeValue(attrName);
    }

    /**
     * 返回构�?好的xml字符�?
     * 
     * @param doc
     * @return
     */
    public static String outXmlStr(Document doc) {
        return doc.asXML();
    }

    /**
     * 保存xml到文�?
     * 
     * @param fileName
     * @param doc
     * @throws IOException
     */
    public static void saveXml(String fileName, Document doc) throws IOException {// 将Document输出到文�?
        // 读取文件
        FileWriter fileWriter = new FileWriter(fileName);
        // 设置文件编码
        OutputFormat xmlFormat = new OutputFormat();
        xmlFormat.setEncoding("GB2312");
        // 创建写文件方�?
        XMLWriter xmlWriter = new XMLWriter(fileWriter, xmlFormat);
        // 写入文件
        xmlWriter.write(doc);
        // 关闭
        xmlWriter.close();
    }

    public static void main(String[] args) {
        // 测试
        try {
            Document doc = XmlHelper.createDoc();
            // 设置编码
            doc.setXMLEncoding("GB2312");
            Element root = doc.addElement("root");
            Element op_code = root.addElement("op_code");
            Element op_name = root.addElement("op_name");
            Element op_user = root.addElement("op_user");
            Element op_passwd = root.addElement("op_passwd");
            Element op_time = root.addElement("op_time");
            Element sp_id = root.addElement("sp_id");
            Element package_id = root.addElement("package_id");
            Element total_num = root.addElement("total_num");
            Element total_amt = root.addElement("total_amt");
            Element client_ip = root.addElement("client_ip");
            op_code.setText("1013");
            op_name.setText("batch_draw");
            // 测试attr 生成
            op_name.addAttribute("test", "1001");
            op_user.setText("");
            op_passwd.setText("");
            op_time.setText("");
            sp_id.setText("");
            package_id.setText("");
            total_num.setText("");
            total_amt.setText("");
            client_ip.setText("");
            // 付款记录
            Element record_set = root.addElement("record_set");
            Element record = record_set.addElement("record");
            Element serial = record.addElement("serial");
            Element rec_bankacc = record.addElement("rec_bankacc");
            Element bank_type = record.addElement("bank_type");
            Element rec_name = record.addElement("rec_name");
            Element pay_amt = record.addElement("pay_amt");
            Element acc_type = record.addElement("acc_type");
            Element area = record.addElement("area");
            Element city = record.addElement("city");
            Element subbank_name = record.addElement("subbank_name");
            Element desc = record.addElement("desc");
            serial.setText("");
            rec_bankacc.setText("");
            bank_type.setText("");
            rec_name.setText("");
            pay_amt.setText("");
            acc_type.setText("");
            area.setText("");
            city.setText("");
            subbank_name.setText("");
            desc.setText("");
            System.out.println(XmlHelper.outXmlStr(doc));
            XmlHelper.saveXml("tenpay.xml", doc);
            // 读取
            Document docXml = XmlHelper.createDocByPath("tenpay.xml");
            System.out.println(XmlHelper.getNode(docXml, "//root/op_code").getText());
            // 获取属�?名称
            System.out.println("arrt: " + XmlHelper.getAttrVal(XmlHelper.getNode(docXml, "//root/op_name"), "test"));
            System.out.println("-----------------------------------------------------");
            Document docStr = XmlHelper.createDocByXmlStr("<person> <name>James</name> </person>");
            System.out.println(XmlHelper.getNode(docStr, "//person/name").getText());
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
